// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

#region

using Neto.Core.SeedData;
using Neto.PermissionGenerate;

#endregion

namespace Neto.Core.CoreServices;

/// <summary>
///     权限自动生成服务
/// </summary>
/// <param name="db"></param>
public class PermissionGenerateService(
    ISqlSugarClient db
) : IPermissionGenerateService, ITransient
{
    /// <summary>
    ///     Api权限生成
    /// </summary>
    /// <param name="area">区域</param>
    public async Task ApiGenerate(string area)
    {
        var menus = PgHelper.GetApiMenus();
        var generateMenus = menus.Adapt<List<SysMenu>>();

        var dbMenus = await db.Queryable<SysMenu>().ToListAsync();


        //数据种子数据
        var seedMenus = MenuSeedData.GetData() ?? new List<SysMenu>();

        #region 删除不存在的数据

        var seedItems = seedMenus as SysMenu[] ?? seedMenus.ToArray();
        {
            var deleteMenus = new List<SysMenu>();
            //排除掉系统菜单，数据种子菜单，需要人工删除
            foreach (var dbMenu in dbMenus.Where(o => o.IsSystem == false))
            {
                //跳过数据种子菜单
                if (seedItems.Any(o => o.Id == dbMenu.Id)) continue;
                var isExist = generateMenus.Any(o => o.Code == dbMenu.Code);
                if (!isExist) deleteMenus.Add(dbMenu);
            }

            if (deleteMenus.Any())
            {
                var ids = deleteMenus.Select(o => o.Id as object).ToList();
                await db.FakeDeleteAsync<SysMenu>(ids);
            }
        }

        #endregion

        #region 添加新增的数据

        {
            var addMenus = new List<SysMenu>();
            foreach (var sourceMenu in generateMenus)
            {
                var isExist = dbMenus.Any(o => o.Code == sourceMenu.Code);
                if (!isExist)
                {
                    //如果菜单图标为空，则默认为系统菜单
                    if (string.IsNullOrWhiteSpace(sourceMenu.Icon))
                        switch (sourceMenu.PgType)
                        {
                            case PgType.Directory:
                                sourceMenu.Icon = "layui-icon layui-icon-template";
                                break;
                            case PgType.Controller:
                                //dbMenu.Icon= "layui-icon layui-icon-right";
                                break;
                            case PgType.Menu:
                                sourceMenu.Icon = "layui-icon layui-icon-link";
                                break;
                            case PgType.Action:
                                sourceMenu.Icon = "layui-icon layui-icon-circle-dot";
                                break;
                        }

                    addMenus.Add(sourceMenu);
                }
            }

            if (addMenus.Any()) await db.InsertRsIdAsync(addMenus);
        }

        #endregion

        #region 更新数据

        {
            var updateMenus = new List<SysMenu>();
            foreach (var sourceMenu in generateMenus)
            {
                var dbMenu = dbMenus.FirstOrDefault(o => o.Code == sourceMenu.Code);
                if (dbMenu != null)
                {
                    dbMenu.Name = sourceMenu.Name;
                    dbMenu.MenuPCode = sourceMenu.MenuPCode;
                    dbMenu.Area = sourceMenu.Area;
                    dbMenu.Controller = sourceMenu.Controller; //一般都是一样的
                    dbMenu.Action = sourceMenu.Action;
                    dbMenu.Actions = sourceMenu.Actions;
                    dbMenu.ActionCode = sourceMenu.ActionCode;
                    dbMenu.IsDeveloper = sourceMenu.IsDeveloper;

                    dbMenu.Route = sourceMenu.Route;
                    dbMenu.Icon = sourceMenu.Icon;
                    dbMenu.IsMenu = sourceMenu.IsMenu;

                    if (string.IsNullOrWhiteSpace(dbMenu.Icon))
                        switch (dbMenu.PgType)
                        {
                            case PgType.Directory:
                                dbMenu.Icon = "layui-icon layui-icon-template";
                                break;
                            case PgType.Controller:
                                //dbMenu.Icon= "layui-icon layui-icon-right";
                                break;
                            case PgType.Menu:
                                dbMenu.Icon = "layui-icon layui-icon-link";
                                break;
                            case PgType.Action:
                                dbMenu.Icon = "layui-icon layui-icon-circle-dot";
                                break;
                        }

                    //如果数据中sort等于0，传入的sort不等于0，则更新
                    if (dbMenu.Sort == 0 && sourceMenu.Sort != 0) dbMenu.Sort = sourceMenu.Sort;

                    //是否登录
                    if (dbMenu.IsLoginOnly !=sourceMenu.IsLoginOnly) dbMenu.IsLoginOnly = sourceMenu.IsLoginOnly;


                    //数据库
                    if (string.IsNullOrWhiteSpace(dbMenu.Remark)) dbMenu.Remark = sourceMenu.Remark;

                    updateMenus.Add(dbMenu);
                }
            }

            if (updateMenus.Any()) await db.UpdateAsync(updateMenus);
        }

        #endregion

        #region 处理数据种子

        {
            var allDbMenus = db.GetList<SysMenu>()
                .ToList();
            //判断父级是否存在，如果不存在，则设置为顶级菜单，添加一个默认的父级菜单
            var addParentMenus = new List<SysMenu>();


            foreach (var seedItem in seedItems)
            {
                if (allDbMenus.Any(o =>
                        !string.IsNullOrWhiteSpace(o.Code) && o.Code.ToLower() == seedItem.Code.ToLower()))
                    continue;
                if (addParentMenus.Any(o => o.Code == seedItem.Code || o.Id == seedItem.Id)) continue; //新增集合中已经存在了
                if (allDbMenus.Any(o =>
                        !string.IsNullOrWhiteSpace(o.Code) && o.Code.ToLower() == seedItem.Code.ToLower()))
                    continue;
                if (addParentMenus.Any(o => o.Code == seedItem.Code || o.Id == seedItem.Id)) continue; //新增集合中已经存在了
                addParentMenus.Add(seedItem);
            }

            if (addParentMenus.Any())
            {
                var addResult = await db.InsertOrUpdateAsync(addParentMenus);
            }
        }

        #endregion

        #region 处理父级

        //
        // {
        //     var allDbMenus = db.GetList<SysMenu>()
        //         .ToList();
        //     //判断父级是否存在，如果不存在，则设置为顶级菜单，添加一个默认的父级菜单
        //     var addParentMenus = new List<SysMenu>();
        //
        //     foreach (var dbMenu in allDbMenus)
        //     {
        //         //PCode为空已经到顶级菜单了，不需要添加，跳过
        //         if (string.IsNullOrWhiteSpace(dbMenu.MenuPCode)) continue;
        //
        //         var isDbExist = allDbMenus.Any(o => o.Code == dbMenu.MenuPCode);
        //         //如果数据库不存在，且新增父级集合中不存在，则添加
        //         if (isDbExist || addParentMenus.Any(o => o.Code == dbMenu.MenuPCode)) continue;
        //
        //         var parentMenu = new SysMenu();
        //         parentMenu.Code = dbMenu.MenuPCode;
        //         parentMenu.Name = dbMenu.MenuPCode;
        //         //例如area等于HtAdmin,Code也等于HtAdmin情况，就排除掉
        //         if (parentMenu.Code.ToLower() != (area ?? "").ToLower())
        //             parentMenu.MenuPCode = area; //没有在上级了
        //         else
        //             parentMenu.MenuPCode = "";
        //
        //         parentMenu.IsEnable = true;
        //         parentMenu.Area = dbMenu.Area;
        //         parentMenu.Controller = "";
        //         parentMenu.Actions = "";
        //         parentMenu.IsSystem = true; //是否系统菜单,系统菜单禁止自动删除
        //         parentMenu.Icon = "layui-icon layui-icon-component";
        //         addParentMenus.Add(parentMenu);
        //     }
        //
        //     if (addParentMenus.Any())
        //     {
        //         var addResult = await db.InsertRsIdAsync(addParentMenus);
        //     }
        // }

        #endregion
    }

    /// <summary>
    ///     MVC权限生成
    /// </summary>
    /// <param name="area">区域</param>
    public async Task MvcGenerate(string area)
    {
    }
}